module top(
    input           clk     ,
    input           rst_n   ,
    inout           dq      ,
    input           key     ,
    output          tx      ,
    output          pwm     ,
    output  [5:0]   sel     ,
    output  [7:0]   dig     ,
    output  [3:0]   led
);
    wire                    key_out     ;
    wire    [15:0]          t_data      ;
    wire    [23:0]          dis_data    ;
    wire                    en          ;
    wire                    uart_en    ;
    wire    [7:0]           uart_data   ;//通过串口模块发送到pc机的

    //当按键有效，就把数据转换给uart

    FSM_KEY             inst_FSM_KEY(
        .clk            (clk      ),
        .rst_n          (rst_n    ),
        .key_in         (key      ),
        .key_out        (key_out  ) 
    );//给key消抖

//温湿度驱动器，clk和rst_n输入时钟复位，dq是inout,t_data是output
    ds18b20_driver      inst_ds18b20_driver(
        .clk            (clk      ),
        .rst_n          (rst_n    ),
        .dq             (dq       ),
        .t_data         (t_data   ) 
    );

//将温度输出到数码管的过渡代码，t_data是温度input,dis_data是数码管显示output,en是output信号，判断温度是否大于28度，大于输出1
    ctrl                inst_ctrl(
        .t_data         (t_data   ),
        .dis_data       (dis_data ),
        .uart_en        (uart_en  ),
        .en             (en       ),
        .uart_data      (uart_data),
        .clk            (clk      ),
        .rst_n          (rst_n    )    
    );
//数码管驱动函数，dis_data是input，输入到数码管中的数据，sel是output片选信号，哪一个数码管，dig是output段选信号数码管的哪一位
    sel_driver          inst_sel_driver(
        .clk            (clk      ) ,
        .rst_n          (rst_n    ) ,
        .dis_data       (dis_data ) ,
        .sel            (sel      ) ,
        .dig            (dig      )  
    );

    //每10s输出一次温度，din是输入数据，din_vld输入有效，dout输出数据，主要目的是并串转换，从pc中输出
    //需要在10s的时候给一个有效信号，应该在哪一部分完成16进制转换为10进制。
    uart_tx             inst_uart_tx(
        .clk            (clk      ),
        .rst_n          (rst_n    ),
        .din            (uart_en ? uart_data : led_data),
        .din_vld        (uart_en|led_en),
        .dout           (tx     ) 
    );

    
    //蜂鸣器当温度超过28时响，en是有效信号input,pwm是输出output
    beep                inst_beep(
        .clk             (clk       ),
        .rst_n           (rst_n     ),
        .en              (en        ),
        // .pwm             (pwm        )    
    );

    test                inst_test(
        .clk            (clk        ),
        .rst_n          (rst_n      ),
        .key            (key_out    ),
        .en             (en         ),
        .uart_en        (uart_en    ),
        .led            (led        ),
        .led_en         (led_en     ),    
        .led_data       (led_data   )
    );

endmodule